<?php
/**
 * DolphinGTK - phpGtk framework
 *
 * @package    DolphinGTK
 * @author     Askarov Ruslan
 * @copyright  Askarov Ruslan (c) 2010.
 * @link       http://groups.google.com/group/dolphingtk
 * @license    http://www.opensource.org/licenses/gpl-license.php GPL
 * @version    0.1
 * @since      PHP v.: 5.2.1
 * @subpackage desktop
 * @category   library
 * @filesource
 */

final class Log
{
  // Файл, в который будут писаться логи.
  private static $log_file;


  /**
   * Метод по умолчанию. Разрешаем использование
   * методов, только как статические.
   *
   * @access public
   * @return void
   */
  public function __construct()
  {
    throw new Exception(
      'Class "Config" used only static methods. And cannot be constructed!'
    );
  }




  /**
   * Метод для сохранения определённого типа ошибки
   *
   * @access public
   * @return void
   */
  public static function verbose() {
    $args = func_get_args();
    return self::write('verbose', $args);
  }




  /**
   * Метод для сохранения определённого типа ошибки
   *
   * @access public
   * @return void
   */
  public static function msg() {
    $args = func_get_args();
    return self::write('msg', $args);
  }




  /**
   * Метод для сохранения определённого типа ошибки
   *
   * @access public
   * @param  string $msg
   * @return void
   */
  public static function warn() {
    $args = func_get_args();
    return self::write('warning', $args);
  }




  /**
   * Метод для сохранения определённого типа ошибки
   *
   * @access public
   * @return void
   */
  public static function error() {
    $args = func_get_args();
    return self::write('error', $args);
  }




  /**
   * Метод для сохранения определённого типа ошибки
   *
   * @access public
   * @return void
   */
  public static function fatal() {
    $args = func_get_args();
    self::write('fatal', $args);
    exit;
  }




  /**
   * Метод для записи ошибок.
   *
   * @access private
   * @param  string $Type
   * @param  string $msg
   * @return void
   */
  private static function write( $Type, $msg )
  {
    if( count($msg) > 1 ) {
      $res = vsprintf($msg[0],array_slice($msg,1));
    } else {
      $res = $msg[0];
    }

    $date = date("d-m-Y");
    $time = date("H:i:s");

    $data[] = $Type;
    $data[] = $date;
    $data[] = $time;

    if( function_exists('debug_backtrace') )
    {
      $trace = next(debug_backtrace());
      $line  = $trace['line'];
      $file  = $trace['file'];

      $data[] = $file;
      $data[] = $line;
      $file_info = "%s\t%d\t";
    }

    $data[] = $res;

    if( empty(self::$log_file) )
    {
      if( !class_exists('OS') )
      {
        load('os');
      }

      $appdata = OS::get_appdata();
      if( empty($appdata) ) {
        $appdata = './';
      }

      self::$log_file = $appdata . 'messages.log';
    }


    if( defined('DEBUG') && DEBUG === true ) {
      print vsprintf("Level: '%s', Msg: '%s'\n", array($data[0], $res));
    } else {
      $result = vsprintf("%s\t%s\t%s\t{$file_info}%s\n", $data);
      if( !writefile( self::$log_file, $result, 'a+' ) ) {
        return false;
      }
    }

    return true;
  }

}
?>